package com.ruoyi.chatgpt.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.ruoyi.chatgpt.domain.TbKeyManager;
import com.ruoyi.chatgpt.mapper.TbKeyManagerMapper;
import com.ruoyi.chatgpt.service.ITbKeyManagerService;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * key管理Service业务层处理
 *
 * @author ruoyi
 * @date 2023-03-06
 */
@Service
@Slf4j
public class TbKeyManagerServiceImpl implements ITbKeyManagerService {
    @Autowired
    private TbKeyManagerMapper tbKeyManagerMapper;

    /**
     * 查询key管理
     *
     * @param id key管理主键
     * @return key管理
     */
    @Override
    public TbKeyManager selectTbKeyManagerById(Long id) {
        return tbKeyManagerMapper.selectTbKeyManagerById(id);
    }

    /**
     * 查询key管理列表
     *
     * @param tbKeyManager key管理
     * @return key管理
     */
    @Override
    public List<TbKeyManager> selectTbKeyManagerList(TbKeyManager tbKeyManager) {
        return tbKeyManagerMapper.selectTbKeyManagerList(tbKeyManager);
    }

    /**
     * 查询key管理列表
     *
     * @param tbKeyManager key管理
     * @return key管理
     */
    @Override
    public List<TbKeyManager> selectTbKeyManagerListCanUse(TbKeyManager tbKeyManager) {
        tbKeyManager.setIsUse(1);
        return tbKeyManagerMapper.selectTbKeyManagerList(tbKeyManager);
    }


    /**
     * 新增key管理
     *
     * @param tbKeyManager key管理
     * @return 结果
     */
    @Override
    public int insertTbKeyManager(TbKeyManager tbKeyManager) {

        Long userId = SecurityUtils.getUserId();
        tbKeyManager.setUserId(userId);
        tbKeyManager.setCreateBy(userId + "");
        tbKeyManager.setUpdateTime(DateTime.now());
        tbKeyManager.setUpdateBy(userId + "");
        tbKeyManager.setCreateTime(DateUtils.getNowDate());
        tbKeyManager.setIsUse(1);
        tbKeyManager.setIsDetele(1);
        return tbKeyManagerMapper.insertTbKeyManager(tbKeyManager);
    }

    /**
     * 修改key管理
     *
     * @param tbKeyManager key管理
     * @return 结果
     */
    @Override
    public int updateTbKeyManager(TbKeyManager tbKeyManager) {

        TbKeyManager tbKeyManager1 = this.selectTbKeyManagerById(tbKeyManager.getId());
        if (tbKeyManager1.getUserId() != SecurityUtils.getUserId()) {
            return 0;
        }

        tbKeyManager.setUpdateTime(DateUtils.getNowDate());
        return tbKeyManagerMapper.updateTbKeyManager(tbKeyManager);
    }

    /**
     * 批量删除key管理
     *
     * @param ids 需要删除的key管理主键
     * @return 结果
     */
    @Override
    public int deleteTbKeyManagerByIds(Long[] ids) {
        int count = 0;
        for (int i = 0; i < ids.length; i++) {
            TbKeyManager tbKeyManager = this.selectTbKeyManagerById(ids[i]);
            if (!Objects.isNull(tbKeyManager)) {
                if (tbKeyManager.getUserId() != SecurityUtils.getUserId()) {
                    return 0;
                }
            }
        }


        return tbKeyManagerMapper.deleteTbKeyManagerByIds(ids);
    }


    /**
     * 批量删除key管理
     *
     * @param key 需要删除的key管理主键
     * @return 结果
     */
    @Override
    public void changeKeyStatusToUsed(String key) {
        tbKeyManagerMapper.changeKeyStatusToUsed(key);
    }

    /**
     * 批量删除key管理
     *
     * @param key 需要删除的key管理主键
     * @return 结果
     */
    @Override
    public void changeKeyStatusToDeteleAsk(String key) {
        tbKeyManagerMapper.changeKeyStatusToDeteleAsk(key);
    }


    /**
     * 删除key管理信息
     *
     * @param id key管理主键
     * @return 结果
     */
    @Override
    public int deleteTbKeyManagerById(Long id) {
        TbKeyManager tbKeyManagerEqId = this.selectTbKeyManagerById(id);
        if (tbKeyManagerEqId.getUserId() != SecurityUtils.getUserId()) {
            return 0;
        }


        return tbKeyManagerMapper.deleteTbKeyManagerById(id);
    }


    /**
     * 查询key管理  -----   管理员使用
     *
     * @param id key管理主键
     * @return key管理
     */
    @Override
    public TbKeyManager selectTbKeyManagerByIdsys(Long id) {
        return tbKeyManagerMapper.selectTbKeyManagerById(id);
    }

    /**
     * 查询key管理列表  -----   管理员使用
     *
     * @param tbKeyManager key管理
     * @return key管理
     */
    @Override
    public List<TbKeyManager> selectTbKeyManagerListsys(TbKeyManager tbKeyManager) {
        return tbKeyManagerMapper.selectTbKeyManagerList(tbKeyManager);
    }

    /**
     * 新增key管理  -----   管理员使用
     *
     * @param tbKeyManager key管理
     * @return 结果
     */
    @Override
    public int insertTbKeyManagersys(TbKeyManager tbKeyManager) {
        tbKeyManager.setCreateTime(DateUtils.getNowDate());
        return tbKeyManagerMapper.insertTbKeyManager(tbKeyManager);
    }

    /**
     * 修改key管理  -----   管理员使用
     *
     * @param tbKeyManager key管理
     * @return 结果
     */
    @Override
    public int updateTbKeyManagersys(TbKeyManager tbKeyManager) {
        tbKeyManager.setUpdateTime(DateUtils.getNowDate());
        return tbKeyManagerMapper.updateTbKeyManager(tbKeyManager);
    }

    /**
     * 批量删除key管理  -----   管理员使用
     *
     * @param ids 需要删除的key管理主键
     * @return 结果
     */
    @Override
    public int deleteTbKeyManagerByIdssys(Long[] ids) {
        return tbKeyManagerMapper.deleteTbKeyManagerByIds(ids);
    }

    /**
     * 删除key管理信息
     *
     * @param id key管理主键
     * @return 结果
     */
    @Override
    public int deleteTbKeyManagerByIdsys(Long id) {
        return tbKeyManagerMapper.deleteTbKeyManagerById(id);
    }


    @Scheduled(cron = "0 0/2 * * * ?")
//    @Scheduled(cron = "* * * * * ?")
    public void checkKey() {
        log.info("schedule running ");
        TbKeyManager tbKeyManager = new TbKeyManager();
        tbKeyManager.setIsUse(0);//已经耗尽
        tbKeyManager.setIsDetele(1);//但是未删除
        //可用的key
        List<TbKeyManager> tbKeyManagers = tbKeyManagerMapper.selectTbKeyManagerList(tbKeyManager);

        if (CollectionUtil.isNotEmpty(tbKeyManagers)) {
            for (TbKeyManager tbKeyManager1 : tbKeyManagers) {
                if (LocalDateTime.now().minusMinutes(45).isAfter(LocalDateTimeUtil.of(tbKeyManager1.getUpdateTime()))) {
                    log.info("restore  apikey");
                    tbKeyManagerMapper.changeKeyStatusToUnused(tbKeyManager1.getSecretKey());
                }
            }

        }


    }
}
